# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

class FT_07a3:
    result=[]
    analysisDescription = ['自定义消息体长度：','数据项个数：','CAN总线数据发送/接收时间：','CAN总线数据项（详见附件5）：']
    analysis07a3Length=[2,2,8,0]
    data_str=['CAN ID：','长度：','否定响应：','服务：','否定响应代码：']
    data_str_len=[4,2,1,1,1]
    nrc_list=[
        {'数值': '00', '缩写': 'NA'},
        {'数值': '10', '缩写': 'GR'},
        {'数值': '11', '缩写': 'SNS'},
        {'数值': '13', '缩写': 'SFNS'},
        {'数值': '14', '缩写': '保留'},
        {'数值': '15', '缩写': '保留'},
        {'数值': '16', '缩写': '保留'},
        {'数值': '17', '缩写': '保留'},
        {'数值': '18', '缩写': '保留'},
        {'数值': '19', '缩写': '保留'},
        {'数值': '20', '缩写': '保留'},
        {'数值': '21', '缩写': 'BRR'},
        {'数值': '22', '缩写': 'CNC'},
        {'数值': '23', '缩写': '保留'},
        {'数值': '24', '缩写': 'RSE'},
        {'数值': '25', '缩写': '保留'},
        {'数值': '26', '缩写': '保留'},
        {'数值': '27', '缩写': '保留'},
        {'数值': '28', '缩写': '保留'},
        {'数值': '29', '缩写': '保留'},
        {'数值': '30', '缩写': '保留'},
        {'数值': '31', '缩写': 'ROOR'},
        {'数值': '32', '缩写': '保留'},
        {'数值': '33', '缩写': 'SAD'},
        {'数值': '35', '缩写': 'IK'},
        {'数值': '36', '缩写': 'ENOA'},
        {'数值': '37', '缩写': 'RTDNE'},
        #0x38~0x4f 保留给ISO15764
        #0x50~0xgf 保留
        {'数值': '70', '缩写': 'UDNA'},
        {'数值': '71', '缩写': 'TDS'},
        {'数值': '72', '缩写': 'GPF'},
        {'数值': '73', '缩写': 'WBSC'},
        #0x74~0x77 保留
        {'数值': '78', '缩写': 'RCRRP'},
        #0x79~0x7d
        {'数值': '7E', '缩写': 'SFNSIAS'},
        {'数值': '80', '缩写': '保留'},
        {'数值': '81', '缩写': 'RPMRH'},
        {'数值': '82', '缩写': 'RPMTL'},
        {'数值': '83', '缩写': 'EIR'},
        {'数值': '84', '缩写': 'EINR'},
        {'数值': '85', '缩写': 'ERTTL'},
        {'数值': '86', '缩写': 'TEMPTH'},
        {'数值': '87', '缩写': 'TEMPTL'},
        {'数值': '88', '缩写': 'VSTH'},
        {'数值': '89', '缩写': 'VSTL'},
        {'数值': '8a', '缩写': 'TPTH'},
        {'数值': '8b', '缩写': 'TPTL'},
        {'数值': '8c', '缩写': 'TRNIN'},
        {'数值': '8d', '缩写': 'TRNIG'},
        {'数值': '8e', '缩写': '保留'},
        {'数值': '8f', '缩写': 'BSNC'},
        {'数值': '90', '缩写': 'SLNIP'},
        {'数值': '91', '缩写': 'TCCL'},
        {'数值': '92', '缩写': 'VTH'},
        {'数值': '93', '缩写': 'VTL'},
        #0x94~0xff 保留
    ]
    did_list=[
        #DID参数，名称，DID数据长度（B），采集间隔参数，备注
        ['b7e2','使用的总柴油机排气处理也',4,'f010','读取单个数据'],
        ['22bb', '', 4, 'f010', '读取多个数据'],
        ['3023','行车制动里程',4,'f010','读取多个数据'],
        ['3022', '行车制动时间', 4, 'f010', '读取多个数据'],
        ['64f2', '', 2, 'f010', '读取多个数据'],
        ['d073', '', 68, 'f010', '读取多个数据'],
        ['d074', '', 52, 'f010', '读取多个数据'],
        ['d075', '', 40, 'f010', '读取多个数据'],
        ['2cdc', '发动机制动激活', 4, 'f011', '读取多个数据项'],
        ['2618', '巡航控制燃油里程', 4, 'f011', '读取多个数据项'],
        ['302b', '滑行燃油消耗', 4, 'f011', '读取多个数据项'],
        ['2619', '巡航控制燃油消耗', 4, 'f011', '读取多个数据项'],
        ['3020', '最高档时间', 4, 'f011', '读取多个数据项'],
        ['2cdd', '发动机制动时间', 4, 'f011', '读取多个数据项'],
        ['6724', '满负荷运行时间', 4, 'f011', '读取多个数据项'],
        ['2ffa', '平均发动机负荷', 4, 'f011', '读取多个数据项'],
        ['2cdb', '发动机制动里程', 4, 'f011', '读取多个数据项'],
        ['351d', '最高档里程', 4, 'f011', '读取多个数据项'],
        ['22b3', '峰值扭矩', 2, 'f012', '读取多个数据项'],
        ['22b4', '峰值扭矩@RPM', 2, 'f012', '读取多个数据项'],
        ['22a8', '最大发动机功率', 2, 'f012', '读取多个数据项'],
        ['22a9', '最大发动机功率RPM', 2, 'f012', '读取多个数据项'],
    ]
    def LogicAisle(self, protocolStr, header):
        msglen = protocolStr[0:4]
        header.append(self.analysisDescription[0] + msglen + '\n')
        data_total=int(protocolStr[4:8],16)
        header.append(self.analysisDescription[1]+str(data_total)+'\n')
        can_time=protocolStr[8:24]
        header.append(self.analysisDescription[2] + can_time + '\n')
        header.append(self.analysisDescription[3]+'\n')

        s=protocolStr[24:]
        #4,2,1,1,1
        for i in range(data_total):
            can_id=s[0:8]
            print("can id:"+can_id)
            header.append(self.data_str[0]+can_id+'\n')
            can_id=self.HextoBin(can_id,4)
            if can_id[0]=='0':
                header.append("CAN通道号：CAN1"+'\n')
            elif can_id[0]=='1':
                header.append("CAN通道号：CAN2"+'\n')
            if can_id[1] == '0':
                    header.append("帧类型：标准帧" + '\n')
            elif can_id[1] == '1':
                    header.append("帧类型：扩展帧" + '\n')
            if can_id[2] == '0':
                    header.append("数据采集方式：原始数据" + '\n')
            elif can_id[2] == '1':
                    header.append("数据采集方式：采集区间的平均值" + '\n')
            can_id_1=can_id[3:]
            header.append("CAN总线响应ID："+can_id_1+'\n')

            l=s[8:12]
            header.append(self.data_str[1]+l+'\n')

            neg_res=s[12:14]
            if neg_res=="7f":
                header.append(self.data_str[2]+neg_res+'\n')
                serv=s[14:16]
                header.append(self.data_str[3]+serv+'\n')
                neg_res_byte=s[16:18]
                for nrc in self.nrc_list:
                    if nrc['数值']==neg_res_byte:
                        header.append(self.data_str[4]+neg_res_byte+nrc['缩写']+'\n')
                        break
                s=s[18:]
            else:
                serv = s[12:14]
                header.append(self.data_str[3] + serv + '\n')
                if serv=="14":
                    subfunc=s[14:20]
                    header.append("子功能："+subfunc+'\n')
                    s=s[20:]
                elif serv=="54":
                    s=s[14:]
                elif serv=="19":
                    subfunc = s[14:16]
                    header.append("子功能：" + subfunc + "控制类型，0x02：根据掩码读取故障码" +'\n')
                    ero_type=s[16:18]
                    header.append("故障码类型："+ero_type+"(掩码；ff：读取全部故障码；09：当前已确认故障；08：历史已确认故障；01：当前故障；)"+'\n')
                    s=s[18:]
                elif serv=="59":
                    subfunc = s[14:16]
                    header.append("子功能：" + subfunc +  "控制类型" +'\n')
                    ero_type = s[16:18]
                    header.append("故障码类型：" + ero_type + "(bit3&bit0=1：当前已确认故障；bit3=1&bit0=0：历史已确认故障；)" + '\n')
                    l=int(l,16)
                    n=(l-3)/4
                    for j in range(n):
                        dtc=s[18+j*8:26+j*8]
                        header.append("DTC:"+dtc+'\n')
                    s=s[12+l*2:]
                elif serv == "22":
                    l = int(l,16)
                    para=s[14:12+l*2]
                    header.append('控制类型：\n')
                    while len(para) >= 4:
                        para_i=para[0:4]
                        para=para[4:]
                        header.append(para_i+'\n')
                    s=s[14+l*2:]
                elif serv=="62":
                    l=int(l,16)
                    did_str=s[14:14+(l-1)*2]
                    while len(did_str)>=4:
                        did_par=did_str[0:4]
                        find=False
                        for did in self.did_list:
                            if did_par==did[0]:
                                find=True
                                header.append("DID参数："+did_par+' '+did[1]+'\n')
                                print(did_str)
                                did_val=did_str[4:4+did[2]*2]
                                did_str=did_str[4+did[2]*2:]
                                header.append("DID数据："+did_val+'\n')
                                break
                        if find==False:
                            did_str=did_str[4:]
                            
                    s=s[12+l*2:]
                    print(s)
        self.result=header

    def HextoBin(self, s, len):
            s = bin(int(s, 16))
            s = s[2:]
            s = s.zfill(len * 8)
            return s
